package com.itheima.relfect;

import com.itheima.domain.Person;

import java.lang.reflect.Field;

/**
 * 获取成员变量
 *      getField和getFields可以获取 public 修饰的成员变量 这样只是获取了在内存中的 要想获取值 或者操作值 还需要把 new 出来的那个对象调进去
 *      a.get(person) a.set(person , 100)   获取和设置
 *      获取成员变量后
 *      getDeclaredFields 获取所有修饰符的  连私有的也能获取 并且能设置值
 *      当然私有的不能直接被访问 要先关掉检查 name.setAccessible(true); 暴力反射
 *
 */
public class ReflectDemo2 {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        //获取字节码对象
        Class personClass = Person.class;

        Person person = new Person("小明" , 12 , 21) ;

        //获取所有成员变量  --
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        //获取单个的 public
        Field a = personClass.getField("a");
        System.out.println(a);

        //这里只是获取这个对象 不是获取他的值
        //设置值
        a.set(person , 100) ;
        //获取值
        Object o = a.get(person);
        System.out.println(o);

        //获取所有类型的
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

        Field name = personClass.getDeclaredField("name");
        //忽略访问修饰符安全检查
        name.setAccessible(true);
        Object o1 = name.get(person);
        System.out.println(o1);
    }
}
